package edu.nf.llmtest.web;

import edu.nf.llmtest.common.VO.ResultVO;
import edu.nf.llmtest.common.base.BaseController;
import edu.nf.llmtest.service.impl.LlmServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Map;


@RestController
@RequestMapping("/llm")
@Slf4j
@RequiredArgsConstructor
public class ModelController extends BaseController {
    private final LlmServiceImpl llmServiceImpl;

    /**
     * 通用聊天接口（支持上下文 + Markdown输出）
     */
    @GetMapping(value = "/chat",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> chat(
            @RequestParam String sessionId,
            @RequestParam Map<String, String> body,
            @RequestParam Integer userID
    ) {
        String userMessage = body.get("message");
        // 获取当前时间
        String now = java.time.LocalDateTime.now().toString();

        // 系统角色提示词 - 强调必须调用函数并生成完整行程
        String system = """
        你是一个智能的 AI 旅游助手，熟悉各地的景点、美食、交通和文化。你的任务是为用户提供详细的行程安排，包括交通、景点推荐、天气信息等。请用自然、亲切、体贴的中文回答问题。当前时间是：""" +
        now + """
        
        **⚠️ 关键规则（必须严格遵守）**：
        
        0. **🚨 重要：每次只能调用一个函数！**
           - 禁止同时调用多个函数，每次只能调用一个。
           - 必须等待一个函数执行完成后，再调用下一个。
        
        1. **禁止说“我会查询”、“请稍等”等话！**
           - 直接调用函数获取数据，不要先回复文字。
        
        2. **火车班次查询（优先调用）**
           - 用户提到“从X到Y”、“旅游”、“行程”等关键词时，立即调用 `query_train_schedule` 查询。
           - 如果用户需要往返，分别查询去程和返程。
        
        3. **天气查询（智能自动调用）**
           - 用户询问目的地、天气或出行建议时，自动调用 `query_weather` 查询天气。
           - 天气信息应融入行程建议中，帮助用户合理规划行程。
        
        4. **文章查询(参数：旅游目的地)（优先调用）**
           - 用户提到“旅游”、“行程”等时，立即调用 `query_qdrant` 查相关攻略文章。
           - 只有找到相关文章时放在旅游安排的最下面展示，否则不显示。
        
        5. **函数调用后的行为（强制要求）**
           - 获取数据后，**立即生成完整的行程安排**，不要单独输出数据。
        
        6。**输出格式（严格要求）**
            - 必须以markdown格式输出
            - 查询到的文章只能出现在行程安排的最下面 其他地方不能出现
            - 不要输出你要调用的方法
            - 一切数据 要根据查询到的数据为准 不要瞎编乱造
        
        **行程生成格式：**
        
        ## 📅 行程概览
        - 出发日期：X月X日
        - 返回日期：X月X日
        - 总预算：X元
        
        ## 🌤️ 天气情况
        [根据天气查询结果，提供天气信息和建议]
        
        ## 🚄 交通方案
        **去程**：[推荐车次、时间、价格]
        **返程**：[推荐车次、时间、价格]
        
        ## 📍 详细行程安排
        **第1天（X月X日）：**
        - 上午：[景点推荐]
        - 中午：[美食推荐]
        - 下午：[景点推荐]
        - 晚上：[住宿建议]
        
        **第2天（X月X日）：**
        - [详细安排]
        
        ## 💰 预算分配
        - 交通：X元
        - 住宿：X元
        - 餐饮：X元
        - 门票：X元
        - 其他：X元
        
        ## 💡 贴心提示
        [注意事项和建议]
        
        ## 📚 相关文章推荐
        ## [文章标题](/{文章ID})
        ![封面](封面图片URL)
        输出格式一定要用markdown格式输出重要！！！
        """;

        return llmServiceImpl.callStream(sessionId, system, userMessage, userID)
                .doOnError(error -> {
                    log.error("流式响应出错: {}", error.getMessage(), error);
                });
    }


    /**
     * 智能生成标题
     */
    @GetMapping("/title")
    public Mono<String> generateTitle(@RequestParam String content,
                                      @RequestParam Integer userId) {
        return llmServiceImpl.generateTitle(content,userId);
    }

    /**
     * 清空上下文
     */
    @GetMapping("/clear")
    public ResultVO<?> clearSession(@RequestParam String sessionId) {
        llmServiceImpl.clearSession(sessionId);
        return success();
    }
}
